import http from '@/common/js/http'
import { createApp } from './main'
import * as utils from './common/js/utils.js'

let { getBuildEnv } = utils
let { isCpOrProd, build, env } = getBuildEnv()
const isProd = isCpOrProd

export default context => {
  return new Promise((resolve, reject) => {
    let { url, isDoubleBind } = context

    const { app, router, store } = createApp(isDoubleBind)

    router.push(url)
    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        return reject({
          code: 404
        })
      }
      // 对所有匹配的路由组件调用 `asyncData()`
      Promise.all(
        matchedComponents.map(Component => {
          let { head, asyncData } = Component
          //只有在测试环境下才会给head里面添加<meta name='robots' content='noindex,nofollow'>标签
          if (build === 'test' && env === 'production') {
            context.head = "<meta name='robots' content='noindex,nofollow'>"
          }
          if (head && isProd) {
            context.head = head
              .map(item => {
                if (item.name === 'title') {
                  return `<title>${item.content}</title>`
                } else {
                  return `<meta name='${item.name}' content='${item.content}'>`
                }
              })
              .join('')
          }
          if (asyncData) {
            return asyncData({
              store,
              route: router.currentRoute,
              isDoubleBind
            })
          }
        })
      )
        .then(() => {
          // 在所有预取钩子(preFetch hook) resolve 后，
          // 我们的 store 现在已经填充入渲染应用程序所需的状态。
          // 当我们将状态附加到上下文，
          // 并且 `template` 选项用于 renderer 时，
          // 状态将自动序列化为 `window.__INITIAL_STATE__`，并注入 HTML。
          context.state = store.state
          // context.routeName = router.currentRoute.name
          // context.aliIcon ='../../common/js/iconsvg.js'
          // console.log(context.htmlMeta)
          resolve(app)
        })
        .catch(reject)
    }, reject)
  }).catch(e => {
    // console.log(e)
  })
}
